#include <iostream>

class Test
{
public:
    Test()
    {
        a = new int;
    }
    ~Test()
    {
        if(a)
            delete a;
    }
    Test(const Test& t)
    {
        std::cout<<"深度拷贝\n";
        this->a = new int(*t.a);
    }

    //移动语义:夺取资源
    Test(Test &&t) //移动构造函数: 通过夺取其他对象的资源构建自身
    {
        std::cout<<"移动构造\n";
        a = t.a;
        t.a = nullptr;
    }
private:
    int *a;
};

void print(int& a)
{
    std::cout<<"左值引用\n";
}

void print(int&& a)
{
    std::cout<<"右值引用\n";
}
//万能引用:既能接左值，也能接右值的模板
// T&&
//万能引用传入的右值在函数调中调用时会被当成左值
//完美转发:使万能引用传入的参数类型保持不变
template<typename T>
void func(T&& a)
{
    print(std::forward<T>(a));
}


int main()
{
    Test t;
    func(10);
    return 0;
}